#include <stdio.h>
#include <cpar.h>

static CPARContext *pGlobalContext;

void bloco(int n);

void bloco(int n)
{
  int i;
  for(i=0;i<10;i++)
  {
    printf("%d",n);
    fflush(stdout);
  }
}

void CPARBlock_4(CPARContext *pContext);
void CPARBlock_3(CPARContext *pContext);
void CPARBlock_2(CPARContext *pContext);
void CPARBlock_1(CPARContext *pContext);

void CPARBlock_4(CPARContext *pContext)
{
  printf("nivel a.2\n");
  fflush(stdout);
  bloco(4);
}

void CPARBlock_3(CPARContext *pContext)
{
  printf("nivel b.2\n");
  fflush(stdout);
  bloco(3);
}

void CPARBlock_2(CPARContext *pContext)
{
  printf("nivel b.1\n");
  fflush(stdout);
  bloco(2);
}

void CPARBlock_1(CPARContext *pContext){
  printf("nivel a.1\n");
  fflush(stdout);
  bloco(1);

  CPARContextTaskDispatch(pContext, 1, CPARBlock_2, 0);
  CPARContextTaskDispatch(pContext, 1, CPARBlock_3, 0);

  CPARContextTaskWaitAll(pContext);

  printf("novos blocos nivel b\n");
  fflush(stdout);
}

int main(int argc, char **argv)
{
  CPARInit();

  if( CPARContextCreate( NULL, &pGlobalContext, 0 ))
  {
    CPAR_ERROR("Falha ao alocar contexto global");
    return CPAR_E_NO_MEMORY;
  }

  if( CPARContextWorkPoolCreate( pGlobalContext, 4 ))
  {
    CPAR_ERROR("Falha ao alocar work pool");
    return -1;
  }

  printf("Inicio\n");
  printf("blocos\n");
  fflush(stdout);

  CPARContextTaskDispatch(pGlobalContext, 4, CPARBlock_1, 0);
  CPARContextTaskDispatch(pGlobalContext, 4, CPARBlock_4, 0);
  CPARContextTaskWaitAll(pGlobalContext);

  printf("Fim\n");

  return 0;
}